{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# USAD在SWaT数据集上实验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np \n",
    "import os\n",
    "import pickle\n",
    "from torch.utils.data import DataLoader\n",
    "from torch.utils.data.sampler import SubsetRandomSampler\n",
    "import torch\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from usad_model import  *\n",
    "import sys\n",
    "sys.path.append('../common/')\n",
    "from evaluator import *\n",
    "from utils import *\n",
    "import random\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr=1e-4\n",
    "num_epochs=70\n",
    "window_size = 12\n",
    "z_dim = 20\n",
    "batch_size = 5120\n",
    "\n",
    "dataset_name = \"SWaT\"\n",
    "general_path = \"%s-batch-%s-epochs-%s-hidden-%s\" %(dataset_name, batch_size, num_epochs, z_dim)\n",
    "\n",
    "model_path = \"../model/USAD/\" + general_path + \".pth\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 预处理标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_datase(dataset):\n",
    "    folder = os.path.join(\"../processed\", dataset)\n",
    "    if not os.path.exists(folder):\n",
    "        raise Exception(\"Processed Data not found.\")\n",
    "    loader = []\n",
    "    for file in [\"train\", \"test\", \"labels\"]:\n",
    "        loader.append(np.load(os.path.join(folder, f\"{file}.npy\")))\n",
    "    ## 准备数据\n",
    "    train_data = loader[0]\n",
    "    test_data = loader[1]\n",
    "    labels = loader[2][:,0].reshape(-1,1)\n",
    "    return train_data, test_data, labels\n",
    "def convert_to_windows(data, window_size):\n",
    "    windows = []\n",
    "    length  = data.shape[0]\n",
    "    for i in range(length):\n",
    "        if length - i >= window_size:\n",
    "            window = data[i:i+window_size]\n",
    "        else:\n",
    "            window = data[i-window_size+1:i+1]\n",
    "        windows.append(window)    \n",
    "    return np.array(windows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data, test_data, labels = load_datase(\"SWaT\")\n",
    " # 转换为时间窗口\n",
    "train_window = convert_to_windows(train_data, window_size)\n",
    "test_window = convert_to_windows(test_data, window_size)\n",
    "train_dataset = torch.from_numpy(train_window).float().view([train_window.shape[0], train_window.shape[1]*train_window.shape[2]])\n",
    "test_dataset =  torch.from_numpy(test_window).float().view([test_window.shape[0], test_window.shape[1]*test_window.shape[2]])\n",
    "train_gaussian_percentage  = 0.2\n",
    "indices = np.random.permutation(len(train_dataset))\n",
    "split_point = int(train_gaussian_percentage * len(train_dataset))\n",
    "train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, drop_last=True,\n",
    "                            sampler=SubsetRandomSampler(indices[:-split_point]), pin_memory=False)\n",
    "val_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, drop_last=True,\n",
    "                        sampler=SubsetRandomSampler(indices[-split_point:]),pin_memory=False)\n",
    "test_loader = DataLoader(dataset = test_dataset, batch_size=batch_size, shuffle=False, drop_last=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 70/70 [09:52<00:00,  8.47s/it]\n"
     ]
    }
   ],
   "source": [
    "model = UsadModel(train_data[0].shape[0]*window_size, z_dim)\n",
    "history = model.fit(\n",
    "    train_loader=train_loader,\n",
    "    validation_loader=val_loader,\n",
    "    epochs=num_epochs\n",
    ")\n",
    "\n",
    "torch.save({\n",
    "    'encoder': model.encoder.state_dict(),\n",
    "    'decoder1': model.decoder1.state_dict(),\n",
    "    'decoder2': model.decoder2.state_dict()\n",
    "    }, model_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cPz4ccHOzk5YvHixEB0dLXz77beCk5OT8M0338jL1ITPRkEQ7whv2LCh8OabbxaZVxnnApOlKmzt2rVCw4YNBXt7e6FLly7C0aNHrV2kChMWFiYAKPI3btw4QRDEW2TfffddoV69eoJGoxH69esnXLlyxbqFLmemjh+AsGXLFnmZBw8eCK+++qrg5uYmODk5Cc8884yQlJRkvUKXs5deeklo1KiRYG9vL3h6egr9+vWTEyVBqP7Hb07hZKkmxOG5554TfHx8BHt7e6F+/frCc889J8TExMjza0IMBEEQfvvtN+Gxxx4TNBqN0LJlS+Gzzz4zml8TPhsFQRD+/PNPAYDJY6uMc0EhCIJQfvVURERERNUL+ywRERERWcBkiYiIiMgCJktEREREFjBZIiIiIrKAyRIRERGRBUyWiIiIiCxgskRERERkAZMlIqJydvDgQSgUiiK/V0VEtonJEhEREZEFTJaIiIiILGCyRETVjl6vx9KlSxEQEABHR0e0b98eP/30E4CCJrJdu3ahXbt2cHBwwJNPPokLFy4YbeN///sf2rRpA41GA39/f3z88cdG83Nzc/Hmm2/Cz88PGo0GTZs2xRdffGG0zKlTp9C5c2c4OTmha9euRX5BnohsA5MlIqp2li5diq+++gobNmzAxYsXMWvWLLz44osIDw+Xl3njjTfw8ccf48SJE/D09MRTTz0FrVYLQExynn32WYwePRrnz5/H+++/j3fffRdffvmlvP7YsWPx/fffY82aNYiMjMTGjRvh7OxsVI63334bH3/8MU6ePAk7Ozu89NJLlXL8RFS++EO6RFSt5Obmwt3dHfv27UNQUJA8feLEicjOzsbkyZPRp08fbNu2Dc899xwA4N69e2jQoAG+/PJLPPvssxgzZgxu376NvXv3yuvPmTMHu3btwsWLFxEVFYUWLVogNDQU/fv3L1KGgwcPok+fPti3bx/69esHANi9ezeGDh2KBw8ewMHBoYKjQETliTVLRFStxMTEIDs7GwMGDICzs7P899VXXyE2NlZezjCRcnd3R4sWLRAZGQkAiIyMRLdu3Yy2261bN0RHR0On0+Hs2bNQqVTo1auXxbK0a9dOfuzj4wMASElJeeRjJKLKZWftAhARlaesrCwAwK5du1C/fn2jeRqNxihhKitHR8cSLadWq+XHCoUCgNifiohsC2uWiKhaad26NTQaDeLj49G0aVOjPz8/P3m5o0ePyo9TU1MRFRWFVq1aAQBatWqFw4cPG2338OHDaN68OVQqFdq2bQu9Xm/UB4qIqi/WLBFRtVK7dm28/vrrmDVrFvR6Pbp374709HQcPnwYLi4uaNSoEQBg4cKFqFu3LurVq4e3334bHh4eGDFiBABg9uzZeOKJJ7Bo0SI899xziIiIwKeffor//ve/AAB/f3+MGzcOL730EtasWYP27dvj+vXrSElJwbPPPmutQyeiCsJkiYiqnUWLFsHT0xNLly7F1atX4erqiscffxxvvfWW3Ay2bNkyzJgxA9HR0ejQoQN+++032NvbAwAef/xx/Pjjj5g/fz4WLVoEHx8fLFy4EOPHj5f3sX79erz11lt49dVXcffuXTRs2BBvvfWWNQ6XiCoY74YjohpFulMtNTUVrq6u1i4OEdkA9lkiIiIisoDJEhEREZEFbIYjIiIisoA1S0REREQWMFkiIiIisoDJEhEREZEFTJaIiIiILGCyRERERGQBkyUiIiIiC5gsEREREVnAZImIiIjIAiZLRERERBb8P0N4gvKUebrTAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_history(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test finished\n"
     ]
    }
   ],
   "source": [
    "model = UsadModel(test_data[0].shape[0]*window_size, z_dim)\n",
    "checkpoint = torch.load(model_path, map_location=get_default_device())\n",
    "model.encoder.load_state_dict(checkpoint['encoder'])\n",
    "model.decoder1.load_state_dict(checkpoint['decoder1'])\n",
    "model.decoder2.load_state_dict(checkpoint['decoder2'])\n",
    "model.to(get_default_device())\n",
    "pred= model.predict_prob(test_loader, alpha=0.8, beta = 0.2)\n",
    "\n",
    "print(\"test finished\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "results_without_adjust = bf_search(labels.squeeze(), pred, verbose=False, is_adjust=False)\n",
    "results_adjust  = bf_search(labels.squeeze(), pred, verbose=False, is_adjust=True) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'f1-score': 0.7649111006343293,\n",
       " 'precision': 0.9933906530404776,\n",
       " 'recall': 0.6218853553355146,\n",
       " 'TP': 33968.0,\n",
       " 'TN': 395072.0,\n",
       " 'FP': 226.0,\n",
       " 'FN': 20653.0,\n",
       " 'threshold': 19.32384176635738}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results_without_adjust"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'f1-score': 0.8465462251550874,\n",
       " 'precision': 0.9110337550820603,\n",
       " 'recall': 0.7905933613828758,\n",
       " 'TP': 43183.0,\n",
       " 'TN': 391081.0,\n",
       " 'FP': 4217.0,\n",
       " 'FN': 11438.0,\n",
       " 'threshold': 9.76793800353987}"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results_adjust"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
